package temp.leetcode.editor.cn;

//给你一个按 非递减顺序 排序的整数数组 nums，返回 每个数字的平方 组成的新数组，要求也按 非递减顺序 排序。
//
//
//
//
//
//
// 示例 1：
//
//
//输入：nums = [-4,-1,0,3,10]
//输出：[0,1,9,16,100]
//解释：平方后，数组变为 [16,1,0,9,100]
//排序后，数组变为 [0,1,9,16,100]
//
// 示例 2：
//
//
//输入：nums = [-7,-3,2,3,11]
//输出：[4,9,9,49,121]
//
//
//
//
// 提示：
//
//
// 1 <= nums.length <= 10⁴
// -10⁴ <= nums[i] <= 10⁴
// nums 已按 非递减顺序 排序
//
//
//
//
// 进阶：
//
//
// 请你设计时间复杂度为 O(n) 的算法解决本问题
//
//
// Related Topics 数组 双指针 排序 👍 735 👎 0

import java.util.Arrays;
import java.util.LinkedList;

import java.lang.Math;

/**
 * 有序数组的平方
 *
 * @author saint
 */
class P977_SquaresOfASortedArray{
    public static void main(String[] args) {
        Solution solution = new P977_SquaresOfASortedArray().new Solution();

    }

    //leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public int[] sortedSquares(int[] nums) {
        /*
        先平方再排序，空间复杂图O(logn)，时间复杂度O(nlogn),使用快速排序
         */
//        for (int i = 0; i < nums.length; i++) {
//            nums[i] = nums[i]*nums[i];
//        }
//        Arrays.sort(nums);
//        return nums;
        /*
        利用数组递增性，以0为分界线，负数平方降序，正数平方升序，
        使用归并排序
         */
        int i = 0;
        for (; i < nums.length; i++) {
            if(nums[i]>=0){
                break;
            }
        }
        if(i==0){
            for (int j = 0; j <nums.length ; j++) {
                nums[j]= nums[j]*nums[j];
            }
            return nums;
        }
        int j=i-1;
        int[] ans = new int[nums.length];
        int k=0;//插入位置
        //i扫描整数，j扫描负数
        while(j>=0&&i<nums.length){
            int left = nums[j]*nums[j];
            int right = nums[i]*nums[i];
            if(left<=right){
                ans[k++]=left;
                j--;
            }
            else{
                ans[k++]=right;
                i++;
            }
        }
        while(j>=0){
            int left = nums[j]*nums[j];
            ans[k++]=left;
            j--;
        }
        while (i<nums.length){
            int right = nums[i]*nums[i];
            ans[k++]=right;
            i++;
        }
        return ans;
    }
}
//leetcode submit region end(Prohibit modification and deletion)

}
